#!groovy
pipeline {
//    任何代理节点执行，随机分配
    agent any

//    //可以指定到某类标签代理节点
//    agent {
//        label: 'windows'
//    }

//    //也可以用docker镜像创建容器代理节点
//    docker {
//        image 'maven:3.9'   //镜像地址
//    }

    options {
        timeout(time: 2, unit: 'HOURS')  //超时时间2小时
        retry(1)    //失败后重试次数
    }

    //使用全局工具
    tools {
        //引用之前全局工具配置的NodeJs的name
        nodejs 'nodejs24'
    }

    //参数化构建
    parameters {
        //获取git仓库分支列表，并选择
        gitParameter branchFilter: 'origin/(.*)',
                defaultValue: 'main',
                name: 'GIT_PROJECT_BRANCH',
                type: 'PT_BRANCH',
                description: '选择发布分支',
                useRepository: 'https://gitee.com/sun-xiaohan/xh-admin-frontend.git'
    }

    //环境变量
    environment {
        //用户密码凭据
        cred_id = "gitee"
        project_name = "xh-admin-frontend"
        //容器名
        service_name = "${project_name}"
        //镜像名
        image = "${service_name}:latest"
        //容器映射端口
        outer_port = "2000"
        //环境
        profile = "production"
        //加入网络
        network = 'xh_default'
        Dockerfile = '''
            FROM nginx:1.25.3-alpine-slim
            # 将编译好的静态文件放进nginx根目录
            COPY dist /usr/share/nginx/html
        '''
    }

    stages {
        stage("拉取代码") {
            steps {
                //拉取代码
                git credentialsId: cred_id, url: 'https://gitee.com/sun-xiaohan/xh-admin-frontend.git', branch: params.GIT_PROJECT_BRANCH
            }
        }
        stage("编译项目") {
            steps {
                sh "npm install"
                sh "npm run build:${profile}"
            }
        }
        stage("构建docker镜像") {
            steps {
                //创建Dockerfile
                sh "echo '${Dockerfile}' > Dockerfile"
                //构建镜像
                sh "docker build -t ${image} ."
            }
        }
        stage("容器部署") {
            steps {
                sh 'if !(test -z "$(docker ps -a | grep -w ' + service_name + ' )") then \n' +
                        '        docker stop ' + service_name +' \n' +
                        '        docker rm ' + service_name + '\n' +
                        '    fi'

                sh "docker run " +
                        " --network=${network} " +
                        " --name ${service_name} " +
                        " -p ${outer_port}:80 " +
                        " --restart=always " +
                        " -d ${image}"
            }
        }
    }

    post {
        //失败后会执行到这里，可以写一些发送邮件的逻辑放在这里提醒
        failure {
            echo '可以写一些发送邮件的逻辑放在这里提醒!'
        }
    }
}
